from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep

# 练习selenium使用，打开网页，等待，获取元素，执行js
# 自动操作浏览器，想获取一个值，但因为页面原因，滚动那个元素也不出现
# 执行js，为了页面显示有进度，又在页面添加元素
# browser = webdriver.Chrome('F:\packages\chrome-driver\chromedriver')
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('selenium 爬虫')
input.send_keys(Keys.ENTER)
print(browser.current_url)
# print(browser.get_cookies())
# print(browser.page_source)

browser.maximize_window()

try:
    path = '//*[@id="1"]/div/div/div[3]/div[1]/div[1]/div/a'
    element = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, path))
    )
    a = browser.find_element_by_xpath(path)
    a.click()

    sleep(2)
    print(browser.current_url)
    window_handles = browser.window_handles  # 这个时候会生成一个新窗口或新标签页的句柄，代表这个窗口的模拟driver
    print('所有句柄: ', window_handles, ', 当前句柄：', browser.current_window_handle)  # 会打印所有的句柄
    browser.close() # 关闭当前窗口
    print('browser: ', browser)
    browser.switch_to.window(window_handles[-1])  # driver切换至最新生产的页面，browser = 接收，否则没切换
    print('browser2: ', browser)
    print('当前链接', browser.current_url)
    # 本例中，设置的等待时长为10秒，但这10秒并非一个固定时间，并不影响脚本执行速度；其次，隐式等待对整个driver的周期都起作用，因此只需要设置一次即可。
    # browser.implicitly_wait(10) # 隐性等待，最长等10秒
    sleep(2)
    print('#######')
    
    # 执行js
    js = 'console.log("hello world")'
    browser.execute_script(js)

    # 滚动页面到文档y=200
    browser.execute_script('window.scrollTo(0, 500)')

    sleep(2)

    # 在页面添加元素
    js = '''
        div=document.createElement('div')
        div.id='mydiv'
        div.style.width='200px'
        div.style.height='100px'
        div.style.backgroundColor='blue'
        document.body.appendChild(div)
        div.innerHTML='{tip}'
        div.style.position='fixed'
        div.style.left='10px'
        div.style.top='600px'
    '''
    js = js.format(tip='执行到这里来了')
    print(js)
    browser.execute_script(js)

    sleep(200000)

    # 滚动这个元素还是出现不了，在控制台中通过上面脚本是可以的?? 跟页面有关吧
    # todo 不能根据class获取到，页面原因需要先滚动页面才出现这个元素
    try:
        e = browser.find_element_by_class_name('likeCount-inner')
        print('text: ', e.text)
    except Exception as error:
        print('异常', error)

    # 获取可以获取的元素
    e2 = browser.find_element_by_css_selector('.Button.VoteButton.VoteButton--up')
    print('e2 text: ', e2.text)
    browser.execute_script("document.querySelector('#mydiv').innerText = '{text2}'".format(text2=e2.text))

    sleep(200)
    print('over sleep')
finally:
    print('finally')
    # browser.quit()


